# 定义进程类
class Process:
    def __init__(self, pid, arrival_time, burst_time):
        self.pid = pid  # 进程ID
        self.arrival_time = arrival_time  # 到达时间
        self.burst_time = burst_time  # 执行时间
        self.start_time = 0  # 开始时间
        self.completion_time = 0  # 完成时间
        self.turnaround_time = 0  # 周转时间
        self.waiting_time = 0  # 等待时间


# 先来先服务调度算法
def fcfs_scheduling(processes):
    current_time = 0  # 系统当前时间
    for process in processes:
        # 如果当前时间小于进程的到达时间，系统会等待
        if current_time < process.arrival_time:
            current_time = process.arrival_time

        # 开始时间
        process.start_time = current_time
        # 完成时间 = 开始时间 + 执行时间
        process.completion_time = current_time + process.burst_time
        # 周转时间 = 完成时间 - 到达时间
        process.turnaround_time = process.completion_time - process.arrival_time
        # 等待时间 = 周转时间 - 执行时间
        process.waiting_time = process.turnaround_time - process.burst_time

        # 更新当前时间
        current_time = process.completion_time


# 打印调度结果
def print_results(processes):
    print("PID\tArrival\tBurst\tStart\tCompletion\tTurnaround\tWaiting")
    for process in processes:
        print(f"{process.pid}\t{process.arrival_time}\t{process.burst_time}\t"
              f"{process.start_time}\t{process.completion_time}\t"
              f"{process.turnaround_time}\t{process.waiting_time}")


# 输入进程的到达时间和执行时间
def main():
    # 示例进程信息
    process_list = [
        Process(1, 0, 6),  # 进程1，到达时间0秒，执行时间6秒
        Process(2, 2, 3),  # 进程2，到达时间2秒，执行时间3秒
        Process(3, 4, 1)  # 进程3，到达时间4秒，执行时间1秒
    ]

    # 按到达时间排序
    process_list.sort(key=lambda x: x.arrival_time)

    # 调度算法
    fcfs_scheduling(process_list)

    # 打印结果
    print_results(process_list)


if __name__ == "__main__":
    main()
